package com.lans.linear;

import java.util.Iterator;

/**
 * @author: lans
 * @date: 2025/2/13
 * @name: 刘宇
 */
public class SequenceList<T> implements Iterable{

    public Iterator iterator() {
        return new MyIterable();
    }

    //自定如何返回当前顺序表中的元素
    private class MyIterable implements Iterator{
        //制定指针
        private int cusor;

        public MyIterable(){
            cusor = 0;
        }

        //判断是否还有下一个元素
        public boolean hasNext(){

            return cusor<N;
        }

        //获取下一个元素
        public Object next(){
            return elses[cusor++];
        }
    }
    

    private T[] elses; // 存储元素的数组
    private int N; // 线性表长度

    /**
     *++
     * @param capacity 容量大小
     */
    public SequenceList(int capacity) {
        this.elses = (T[])new Object[capacity];
        this.N=0;
    }
    /**
     * 清空线性表
     */
    public void clear(){
        this.N=0;
    }

    /**
     * 判断是否为空
     * @return
     */
    public boolean isEmpty(){
        return this.N==0;
    }

    /**
     * 获取线性表中元素的个数
     * @return
     */
    public int length(){
        return this.N;
    }

    /**
     * 读取并放回线性表中的第i个元素的值
     * @param i
     * @return
     */
    public T get(int i){
        return elses[i];
    }

    /**
     * 在线性表的第i个元素之间插入一个值为t的数据元素
     * @param i
     * @param t
     */
    public void insert(int i,T t){
        //扩容
        if(N==elses.length){
            resize(2*elses.length);
        }
        for(int index = N;index>i;index--){
            elses[index] = elses[index-1];
        }
        elses[i]=t;
        N++;
    }

    /**
     * 向线性表中添加一个元素t
     * @param t
     */
    public void insert(T t){
        if(N==elses.length){
            resize(2*elses.length);
        }
        elses[N++] = t;
    }

    /**
     * 删除并返回线性表中的第i个元素
     * @param i
     * @return
     */
    public T remove(int i){
        T current = elses[i];
        for(int index = i;index<N-1;index++){
            elses[index] = elses[index+1];
        }
        N--;
        if(N<elses.length/4){
            resize(elses.length/2);
        }
        return current;
    }

    /**
     * 返回线性表中首次出现的指定的数据元素的位序号 若不存在返回-1
     * @param t
     * @return
     */
    public int indexOf(T t){
        for(int i=0;i<N;i++){
            if(elses[i]==t){
                return i;
            }
        }
        return -1;
    }

    /**
     * 修改数组大小
     */
    private void resize(int newSize){
        T[] temp = elses;
        elses = (T[]) new Object[newSize];
        for(int i = 0;i<N;i++){
            temp[i] = elses[i];
        }
    }
    //----------------------------------------------------
    //测试
    public static void main(String[] args) {
        SequenceList<String > stringSequenceList = new SequenceList<>(5);
        stringSequenceList.insert("猪八戒");
        stringSequenceList.insert("淼淼");
        stringSequenceList.insert("宇宇");
        stringSequenceList.insert(1,"唐僧");
        stringSequenceList.remove(0);
        String s = stringSequenceList.get(0);
        System.out.println(s);

        Iterator iterator = stringSequenceList.iterator();
        //使用迭代器遍历集合
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

}